﻿using System;
using System.IO;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace Rendiciones.Logica.Servicios
{
    public interface IServExcel
    {
        void Escribir(FileInfo archivo, string columna, uint fila, object valor);
    }

    class ServExcel : IServExcel
    {
        public void Escribir(FileInfo archivo, string columna, uint fila, object valor)
        {
            if (!archivo.Exists)
                throw new Exception("El archivo no existe");
            
            using (var excel = SpreadsheetDocument.Open(archivo.FullName, true))
            {
                var libro = excel.WorkbookPart;
                var hoja = libro.WorksheetParts.First().Worksheet;
                var data = hoja.GetFirstChild<SheetData>();

                Row row;
                if (hoja.Elements<Row>().Where(r => r.RowIndex.Equals(fila)).Count() != 0)
                    row = hoja.Elements<Row>().Where(r => r.RowIndex.Equals(fila)).First();
                else {
                    row = new Row { RowIndex = fila };
                    data.Append(row);
                }
                
                Cell cell;
                if (row.Elements<Cell>().Where(c => c.CellReference.Value.Equals(columna + fila)).Count() > 0)
                {
                    cell = row.Elements<Cell>().Where(c => c.CellReference.Value.Equals(columna + fila)).First();
                    cell.DataType = new EnumValue<CellValues>(CellValues.String);
                    switch (valor.GetType().Name)
                    {
                        case "System.Decimal":
                        case "System.Int32":
                        case "System.Double":
                        case "System.Single":
                            cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                            break;
                    }
                }
                else
                {
                    Cell refCell = null;
                    foreach (Cell c in row.Elements<Cell>())
                    {
                        if (string.Compare(c.CellReference.Value, columna + fila, true) > 0)
                        {
                            refCell = c;
                        }
                    }

                    cell = new Cell() { CellReference = columna + fila };
                    cell.DataType = new EnumValue<CellValues>(CellValues.String);
                    switch (valor.GetType().Name)
                    {
                        case "System.Decimal":
                        case "System.Int32":
                        case "System.Double":
                        case "System.Single":
                            cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                            break;
                    }
                    row.InsertBefore(cell, refCell);
                }

                hoja.Save();
            }
        }
    }
}